"""
模拟器解析器
从独立存储中提取模拟器信息并格式化显示
"""
from typing import List, Dict, Any
from gui.simulator_storage import load_simulators


def extract_simulators(profile: str, cmd_id: str) -> List[Dict[str, Any]]:
    """
    从独立存储中提取指定版本和指令的模拟器信息

    Args:
        profile: 版本标识，如 "sichuan/2025"
        cmd_id: 指令ID，如 "0x0200"

    Returns:
        模拟器信息列表，每项包含：
        - type: 模拟器类型 (time/num/location)
        - enabled: 启用状态
        - config_summary: 关键配置摘要
        - target_field: 单个目标字段（用于定位）
        - target_display: 目标字段显示文本
        - full_config: 完整配置
        - simulator_index: 模拟器在数组中的索引（用于编辑/删除）
    """
    simulators_array = load_simulators(profile, cmd_id)
    result = []

    for index, sim in enumerate(simulators_array):
        sim_type = sim.get('type', 'unknown')
        targets = sim.get('targets', [])

        # 根据类型处理 targets
        if sim_type == 'location' and isinstance(targets, dict):
            # location 类型：拆分成两行显示
            lat_field = targets.get('lat', '')
            lng_field = targets.get('lng', '')

            # lat 行（第一行，显示完整类型名）
            result.append({
                'type': sim_type,
                'enabled': sim.get('enable', False),
                'config_summary': format_simulator_summary(sim),
                'target_field': lat_field,  # 用于定位的单个字段
                'target_display': f"lat: {lat_field}",  # 显示文本
                'full_config': sim,
                'simulator_index': index,
                'location_part': 'lat',  # 标记这是 location 的 lat 部分
                'is_first_row': True  # 标记这是第一行
            })

            # lng 行（第二行，显示缩进符号）
            result.append({
                'type': sim_type,
                'enabled': sim.get('enable', False),
                'config_summary': format_simulator_summary(sim),
                'target_field': lng_field,
                'target_display': f"lng: {lng_field}",
                'full_config': sim,
                'simulator_index': index,
                'location_part': 'lng',  # 标记这是 location 的 lng 部分
                'is_first_row': False  # 标记这是第二行（子行）
            })
        elif isinstance(targets, list):
            # time/num 类型：多个字段用逗号分隔显示在一行
            if targets:
                target_display = ', '.join(targets)
                # 存储所有字段，用于多字段定位
                result.append({
                    'type': sim_type,
                    'enabled': sim.get('enable', False),
                    'config_summary': format_simulator_summary(sim),
                    'target_field': targets[0] if len(targets) == 1 else None,  # 单字段时直接存储，多字段时为None
                    'target_fields': targets,  # 所有字段列表
                    'target_display': target_display,
                    'full_config': sim,
                    'simulator_index': index
                })
        else:
            # 未知格式，保持原有逻辑
            result.append({
                'type': sim_type,
                'enabled': sim.get('enable', False),
                'config_summary': format_simulator_summary(sim),
                'target_field': None,
                'target_display': str(targets),
                'full_config': sim,
                'simulator_index': index
            })

    return result


def format_simulator_summary(sim_config: Dict[str, Any]) -> str:
    """
    格式化模拟器关键信息为简短字符串

    Args:
        sim_config: 模拟器配置字典

    Returns:
        格式化后的摘要字符串
    """
    sim_type = sim_config.get('type', 'unknown')
    config = sim_config.get('config', {})

    if sim_type == 'time':
        # 时间模拟器
        format_str = config.get('format', '未指定格式')
        offset = config.get('offset', 0)

        if offset != 0:
            return f"{format_str} (偏移{offset:+d}s)"
        else:
            return format_str

    elif sim_type == 'num':
        # 数值模拟器
        mode = config.get('mode', 'random')
        min_val = config.get('min', 0)
        max_val = config.get('max', 100)

        if mode == 'random':
            return f"随机({min_val}-{max_val})"
        elif mode == 'increment':
            step = config.get('step', 1)
            return f"递增({min_val}-{max_val},步长{step})"
        else:
            return f"{mode}({min_val}-{max_val})"

    elif sim_type == 'location':
        # 经纬度模拟器
        lat_range = config.get('lat_range', [30.0, 40.0])
        lng_range = config.get('lng_range', [120.0, 130.0])
        return f"纬度{lat_range[0]:.1f}-{lat_range[1]:.1f}, 经度{lng_range[0]:.1f}-{lng_range[1]:.1f}"

    else:
        return f"未知类型({sim_type})"


def format_simulator_type_display(sim_type: str) -> str:
    """
    格式化模拟器类型为显示名称

    Args:
        sim_type: 模拟器类型标识

    Returns:
        显示名称
    """
    type_map = {
        'time': '时间',
        'num': '数值',
        'location': '经纬度',
        'unknown': '未知'
    }
    return type_map.get(sim_type, sim_type)


def format_simulator_status(enabled: bool) -> str:
    """
    格式化模拟器启用状态

    Args:
        enabled: 是否启用

    Returns:
        状态显示字符串
    """
    return "✓ 已启用" if enabled else "✗ 已禁用"


def get_simulator_statistics(simulators: List[Dict[str, Any]]) -> Dict[str, int]:
    """
    获取模拟器统计信息

    Args:
        simulators: 模拟器列表

    Returns:
        统计信息字典，包含total和enabled数量
    """
    total = len(simulators)
    enabled = sum(1 for sim in simulators if sim['enabled'])

    return {
        'total': total,
        'enabled': enabled,
        'disabled': total - enabled
    }
